﻿using System;
using System.Net;
using System.Threading;

using UdpTransceiver;
using ParametersParser;


namespace RepeaterService
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Program_UnhandledException);
            
            #region Инициализируем адреса и порты

            m_localIP = IPAddress.Parse("192.168.40.1");
            m_localPort = 11000;
            m_remoteIP = IPAddress.Parse("192.168.40.128");
            m_remotePort = 11000;

            #endregion

            Console.WriteLine("Start listening to model? (y/n)");
            if (Console.ReadLine() == "y")
            {
                Console.WriteLine("Initializing UPD receiver...");
                InitializeReceiver();
                Console.WriteLine("UPD receiver ready.");

                InitializeListening();              
            }
         }

        static void Program_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Console.WriteLine(((Exception)e.ExceptionObject).Message );
        }

        #region Implementation

        /// <summary>
        /// Инициализировать UDP приемник
        /// </summary>
        private static void InitializeReceiver()
        {
            m_receiver = new UDPReceiver(m_localIP, m_localPort, m_remoteIP, m_remotePort);                                
        }
        /// <summary>
        /// Инициализировать прием UDP пакетов
        /// </summary>
        private static void InitializeListening()
        {
            Console.WriteLine("Listening...");

            //Получаем датаграмму
            UDPDatagram currentDatagramm = m_receiver.ReceiveDatagram();
            //Преобразуем датаграмму в сообщение
            var currentMessage = new ModelMessage(currentDatagramm.MessageBody);

            Console.WriteLine("{0} : Package of type {1} received.", DateTime.Now, currentDatagramm.PackageType);
            //Если пришел информационный пакет
            if (currentDatagramm.PackageType == PackageTypes.Info)
            {
                //например возьмем параметр высота
                string paramName = "ALTITUDE";
                //получаем значение параметра из сообщения
                var paramValue = currentMessage.GetParameter(paramName);
                //отправляем имя-значение в метод работающий с СОМ портом
                Send2Com(paramName, paramValue);

            }
            //запускаем сами себя для бесконечой прослушки модели
            InitializeListening();
        }
        
        private static void Send2Com(string paramName, object paramValue)
        {
            Console.WriteLine("Sending to COM port {0} parameter {1} = {2}", 1, paramName, paramValue);
            //TODO: отправить данные на СОМ порт
        }

        #endregion

        #region Members

        private static IPAddress m_localIP;
        private static int m_localPort;
        private static IPAddress m_remoteIP;
        private static int m_remotePort;
        private static UDPReceiver m_receiver;

        #endregion
    }
}
